package com.qezhhnjy.leetcode.question.tree;

import com.qezhhnjy.leetcode.entity.TreeNode;

/**
 * @author qezhhnjy
 * @date 2020/12/20-21:07
 * 给出一棵二叉树，其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如，如果路径为 0 -> 1 -> 1 -> 0 -> 1，那么它表示二进制数 01101，也就是 13 。
 * <p>
 * 对树上的每一片叶子，我们都要找出从根到该叶子的路径所表示的数字。
 * <p>
 * 返回这些数字之和。题目数据保证答案是一个 32 位 整数。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/sum-of-root-to-leaf-binary-numbers
 */
public class BinaryTreeSum {

    public int sum = 0;

    public int sumRootToLeaf(TreeNode root) {
        if (root == null) return 0;
        recursion(root, root.val);
        return sum;
    }

    private void recursion(TreeNode root, int val) {
        if (root.left != null) recursion(root.left, (val << 1) + root.left.val);
        if (root.right != null) recursion(root.right, (val << 1) + root.right.val);
        if (root.left == null && root.right == null) sum += val;
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(0);
        root.right = new TreeNode(1);
        root.left.left = new TreeNode(0);
        root.left.right = new TreeNode(1);
        root.right.left = new TreeNode(0);
        root.right.right = new TreeNode(1);
        System.out.println(new BinaryTreeSum().sumRootToLeaf(root));
    }
}
